本章课程PDF,视频(油管B站)。

训练一个encoder,通常有input,但是不知道code是什么,没有办法learn。训练一个decoder,知道output是什么,但没有input,也没有办法learn。可以把encoder、decoder接起来一起learn。

PCA做的事情其实类似。中间hidden layer又叫Bottleneck layer,因为code往往比input的维数小得多,看起来就很窄。hidden layer的output就是我们要找的code。

Deep Auto-encoder

中间特别窄的layer,这个layer的ouput就是code。从input到bottleneck的部分是encoder,从bottleneck到output部分是decoder。在训练时候可以保证参数是左右对称的,这样可以减少参数,防止overfitting。但是对称是不必要的,直接用BP训练也可以。

明显看出Deep Auto-encoder的output比PCA好很多。

用PCA降成2维可视化后,会发现数字是混在一起的。用Deep Auto-encoder降维后,数字是分开的。

Auto-encoder – Text Retrieval

把文章变成一个code,得到vector space model,把查询词汇也变成一个vector,两者之间做点积进行查询。

一种方法是词袋,但是这种方法中每个词都独立,不能知道语意。

用Auto-encoder可以把语意考虑进来。词袋经过auto-encoder之后得到code。图中不同颜色代表文档的不同种类。用LSA的效果就不太好。

最简单的方法是基于像素计算图片之间相似度,往往得到的结果会比较差。比如,会得到迈克尔杰克逊的照片比较像马蹄铁。而把image经过auto-encoder变成code,基于code计算相似度,结果就会好很多。

Auto-encoder – Pre-training DNN

为了在训练NN时找到一组好的初始值,可以用Auto-encoder做预训练。

预训练过程如图所示:




在训练第一个auto-encoder时,由于hidden layer的维数大于input维数,要加很强的正则项,e.g.对1000维的output做L1正则化(希望output稀疏)。否则hidden layer可能直接记住input,没有learn到任何东西。 在训练第二个auto-encoder时,要把database中所有digit都变成1000维vector。 以此类推,最后随机初始化输出层之前的权重。然后用BP做fine-tune。

之前在训练较深的Neural Network时要用到预训练,但是现在没必要了,因为训练技术进步了。 但在有大量unlabelled data、少量labelled data时仍需要预训练,可以先用大量unlabelled data先把W1,W2,W3先learn好,最后的labelled data只需稍微调整weight就好。

De-noising auto-encoder

对输入的数据增加noise,然后再使经过auto-encoder的输出尽可能与没有noise的原数据一样。这样learn出来的结果更具有鲁棒性。

Auto-encoder for CNN

Unpooling

在pooling的时候记得从哪里取的值,unpooling的时候在对应位置恢复,其余位置补0。Keras中unpooling是直接把pooling后的每个值直接复制4份。

Deconvolution

Use decoder to generate something

把图片从784维降到2维,根据code的分布选择红框,在红框里等间隔采样,作为decoder的input,生成图片。 选取红框的时候需要提前知道code的分布,才能知道哪里采样出来比较可能是image,假如红框选错了位置,选在右下方,就可能得不到数字。提前分析二维code分布比较麻烦,为了确保采样的都能是image,可以在code上加正则化。 在训练时,对code加L2正则化,这样code比较接近0。采样时在0附近采样,这样采样得到的就比较有可能都对应数字。

如果本博文对您有帮助,可以赞助支持一波博主~